/*
源文件描述符
目标文件描述符
源文件开始位置
目标文件开始位置
*/

#include <head.h>

// 传递一个参数
void *Func_1(void *agrc)
{
    int *val = (int *)agrc;

    printf("val = %d\n", *val);
}

// 传递多个参数 需要使用到 结构体  方法 1
typedef struct File_copy_arg
{
    int dest_fd;   // 目标文件 文件描述符
    int src_fd;    // 源文件   文件描述符
    off_t bin_off; // 开始位置
    off_t end_off; // 结束位置
} File_copy_arg;

void *Func_2(void *agrc)
{
    // 这种方式是直接变成数据
    File_copy_arg data_1 = *((File_copy_arg *)agrc);
    // 读取结构体的首地址
    File_copy_arg *data_2 = (File_copy_arg *)agrc;

    printf("dest_fd = %d src_fd = %d bin_off = %d end_off = %d\n", data_1.dest_fd, data_1.src_fd,
           data_1.bin_off, data_1.end_off);
}

File_copy_arg data_3;

// 传递多个参数 需要使用到 结构体  方法 2
void *Func_3(void *agrc)
{
    printf("dest_fd = %d src_fd = %d bin_off = %d end_off = %d\n", data_3.dest_fd, data_3.src_fd,
           data_3.bin_off, data_3.end_off);
}

int main(int argc, char const *argv[])
{
    /******************************* 线程传递参数 一个参数 *******************************/
    pthread_t tid_1 = 0;

    int arg_1 = 10;

    // 创建线程
    if (0 != pthread_create(&tid_1, NULL, Func_1, (void *)&arg_1))
    {
        printf("线程创建失败");
        exit(1);
    }

    // 等待线程结束
    pthread_join(tid_1, NULL);
    /******************************* 线程传递参数 多个参数 *******************************/
    // 方法一 直接传递
    pthread_t tid_2 = 0;

    File_copy_arg arg_2 = {.bin_off = 10, .end_off = 50, .src_fd = 3, .dest_fd = 4};

    // 创建线程
    if (0 != pthread_create(&tid_2, NULL, Func_2, (void *)&arg_2))
    {
        printf("线程创建失败");
        exit(1);
    }

    // 等待线程结束
    pthread_join(tid_2, NULL);

    /******************************* 线程传递参数 多个参数 *******************************/
    // 方法二  全局
    pthread_t tid_3 = 0;

    data_3.bin_off = 520;
    data_3.end_off = 520;
    data_3.src_fd = 520;
    data_3.dest_fd = 520;

    // 创建线程
    if (0 != pthread_create(&tid_3, NULL, Func_3, NULL))
    {
        printf("线程创建失败");
        exit(1);
    }

    // 等待线程结束
    pthread_join(tid_3, NULL);
}
